import { useTokenStore } from '@/store/token'
import {

  isNeedLoginMode,
  navigateToLogin,
  needLogin,
} from './config'

// 导航拦截器接口
interface NavigateInterceptor {
  invoke: (options: { url: string }) => boolean | void
  success?: (res: any) => void
  fail?: (err: any) => void
  complete?: (res: any) => void
}

// 通用导航拦截逻辑
function createNavigateInterceptor(): NavigateInterceptor {
  return {
    invoke({ url }: { url: string }) {
      console.log('路由拦截器 - 导航到:', url)

      // 如果未启用登录模式，直接放行
      if (!isNeedLoginMode) {
        return true
      }

      // 解析路径（去除参数）
      const path = url.split('?')[0]

      // 检查是否需要登录
      if (needLogin(path)) {
        const tokenStore = useTokenStore()

        if (!tokenStore.hasLogin) {
          console.log('未登录，拦截导航，跳转到登录页')

          // 阻止原导航
          setTimeout(() => {
            navigateToLogin(url)
          }, 0)

          return false
        }
      }

      return true
    },

    success(res) {
      console.log('导航成功:', res)
    },

    fail(err) {
      console.error('导航失败:', err)
    },
  }
}

// 创建各种导航方法的拦截器
const navigateToInterceptor = createNavigateInterceptor()
const redirectToInterceptor = createNavigateInterceptor()
const reLaunchInterceptor = createNavigateInterceptor()
const switchTabInterceptor = createNavigateInterceptor()

// TabBar 拦截器（特殊处理）
const tabBarInterceptor: NavigateInterceptor = {
  invoke({ url }: { url: string }) {
    console.log('TabBar 拦截器 - 切换到:', url)

    // TabBar 页面一般不需要登录验证，但可以在这里添加特殊逻辑
    return true
  },
}

// 页面加载拦截器
interface PageInterceptor {
  onLoad?: (options: any) => void
  onShow?: () => void
  onReady?: () => void
  onHide?: () => void
  onUnload?: () => void
}

// 创建页面生命周期拦截器
function createPageInterceptor(): PageInterceptor {
  return {
    onLoad(options) {
      console.log('页面加载:', options)

      // 页面加载时的通用逻辑
      const pages = getCurrentPages()
      const currentPage = pages[pages.length - 1]
      const route = currentPage.route || ''

      console.log('当前页面路由:', route)

      // 如果启用登录模式且页面需要登录
      if (isNeedLoginMode && needLogin(`/${route}`)) {
        const tokenStore = useTokenStore()

        if (!tokenStore.hasLogin) {
          console.log('页面需要登录，但用户未登录')
          // 可以在这里添加额外的处理逻辑
        }
      }
    },

    onShow() {
      console.log('页面显示')

      // 页面显示时的通用逻辑
      // 例如：检查登录状态、刷新数据等
    },

    onReady() {
      console.log('页面渲染完成')
    },

    onHide() {
      console.log('页面隐藏')
    },

    onUnload() {
      console.log('页面卸载')
    },
  }
}

// 路由守卫类
export class RouteGuard {
  private static instance: RouteGuard
  private interceptors: Map<string, any> = new Map()

  static getInstance(): RouteGuard {
    if (!RouteGuard.instance) {
      RouteGuard.instance = new RouteGuard()
    }
    return RouteGuard.instance
  }

  // 安装路由拦截器
  install() {
    console.log('安装路由拦截器')

    // 安装导航拦截器
    uni.addInterceptor('navigateTo', navigateToInterceptor)
    uni.addInterceptor('redirectTo', redirectToInterceptor)
    uni.addInterceptor('reLaunch', reLaunchInterceptor)
    uni.addInterceptor('switchTab', switchTabInterceptor)

    // 存储拦截器引用，用于后续移除
    this.interceptors.set('navigateTo', navigateToInterceptor)
    this.interceptors.set('redirectTo', redirectToInterceptor)
    this.interceptors.set('reLaunch', reLaunchInterceptor)
    this.interceptors.set('switchTab', switchTabInterceptor)

    console.log('路由拦截器安装完成')
  }

  // 移除路由拦截器
  uninstall() {
    console.log('移除路由拦截器')

    this.interceptors.forEach((interceptor, method) => {
      uni.removeInterceptor(method as any)
    })

    this.interceptors.clear()
    console.log('路由拦截器移除完成')
  }

  // 临时禁用拦截器
  disable() {
    this.uninstall()
  }

  // 重新启用拦截器
  enable() {
    this.install()
  }
}

// 导出拦截器实例
export const routeGuard = RouteGuard.getInstance()

// 导出独立的拦截器（兼容旧版本使用方式）
export const routeInterceptor = {
  install() {
    routeGuard.install()
  },
  uninstall() {
    routeGuard.uninstall()
  },
}

// 导出页面拦截器
export const pageInterceptor = createPageInterceptor()

// 全局路由监听器
export function setupRouteListener() {
  console.log('设置全局路由监听器')

  // 监听路由变化
  // 注意：uni-app 中没有全局路由监听，需要在各个页面中手动调用
}

// 默认导出路由拦截器
export default routeInterceptor
